package com.atde._03_creational_design_patterns.singleton.type03;


/**
 * @BelongsProject: hsp_java_design_mode
 * @BelongsPackage: com.atde._03_creational_design_patterns.singleton.type03
 * @Author: Del
 * @CreateTime: 2025-05-26  02:10
 * @Description: 单例模式写法3 -- 懒汉式（线程不安全）
 * @Version: 1.0
 */
public class SingletonTest03 {
    public static void main(String[] args) {
        // 懒汉式（线程不安全的）
        Singleton  instance = Singleton.getInstance();
        Singleton singleton = Singleton.getInstance();
        System.out.println(instance == singleton);
        System.out.println("instance.hashCode = " +instance.hashCode());
        System.out.println("singleton.hashCode = " +singleton.hashCode());
    }
}

/**
 * 懒汉式（线程不安全的）
 * 1） 起到了Lazy loading 的效果，但是只能在单线程下使用
 * 2） 如果在多线程下，一个线程进入了if(singleton == null) 判断语句块，还未来得及往下执行
 * 另一个线程也通过了这个判断语句，这是便会产生多个实例。所以在多线程环境下不可使用这种方式
 * 3）结论：在实际开发中，不要使用这种方式
 */
class Singleton {
    private static Singleton instance;

    // 1. 私有化构造器，避免外部创建对象
    private Singleton() {

    }

    // 2. 提供一个静态公有方法，当使用到该方法时，才去创建 instance
    // 即懒汉式
    public static Singleton getInstance() {
        if (instance == null) {
            instance = new Singleton();
        }
        return instance;
    }
}
